2006年10月15日
川俣晶の縁側ソフトウェア技術雑記 total 3444 count

メソッドが匿名であることの決定的な価値とは

Written By: 川俣 晶連絡先

 そうか!

 メソッドが名前を持たないことは一種の手抜きだと思っていて、全てのメソッドには識別子としての一意の名前がある方が良いと思っていましたが、そうではない事例があるわけですね。

 C# 2.0でたった今書いたコードです。

public class Authenticators

{

    public static Authenticator NullAuthenticator

        = delegate(HttpdEnveironment environment, 

                            HttpRequest httpRequest)

            {

                return ResultsFactory.GetOKResult();

            };

}

 クラスAuthenticatorsは不特定のアプリから利用されうる汎用のクラスです。

 ここで、NullAuthenticatorはアプリ側から差し替え可能なメソッドを意図しています。

 つまり、delegate型のメンバ変数として宣言されており、デフォルト値として匿名のメソッドが代入されています。アプリは、このメンバ変数を書き換えることにより、ライブラリの中を含め全てのNullAuthenticatorを呼び出すコードの呼び出し先を差し替えることができます。

 さて、ここで問題になるのは、NullAuthenticatorを呼ばずに直接デフォルトの処理メソッドを呼び出すコードを書いてしまったらどうなるのかです。そのようなコードがあれば、NullAuthenticatorを差し替えたプログラム中で処理の不整合が起こる可能性があり、危険です。

 ところが、デフォルト処理のメソッドが匿名であるなら、名前を指定して呼び出すことができないのです。どうしても呼び出したいなら、NullAuthenticatorを書き換える前に入っていた値を保存しておき、それを経由して呼ぶしかありません。しかし、そのような込み入ったコードを「うっかり間違って書いて気付かない」ということは、まずあり得ないでしょう。

 つまり、匿名のメソッドにより、安全性が高くなったわけです。

なぜ、そんな基本的なことを今頃やってるの? §

 それは、やっと今になってC# 2.0を本格的に使い始めたからだよ。

 まあ、いろいろ心理的に複雑で矛盾した軋轢があったということですね。